#ifndef __FSM_LITE_H__
#define __FSM_LITE_H__

#include "stdint.h"

#define fsm_sta_t   uint8_t
#define fsm_time_t  uint16_t

#define FSM_Task_Init(me_)                  do {me_.Status = 0; me_.nTicks = 0; me_.Run = 0;} while(0)     
#define FSM_Task_Stop(me_)                  do {me_.nTicks = 0; me_.Run = 0;} while(0)
#define FSM_Task_Start(me_, evt, tick)      do {me_.Event = evt; me_.nTicks = tick; if(me_.nTicks == 0) {me_.Status |= evt; me_.Run = 1;}} while(0)
#define FSM_Timer_Run(me_)                  do {if(me_.nTicks) {me_.nTicks --; if(me_.nTicks == 0) {me_.Status |= me_.Event; me_.Run = 1;}}} while(0)

#define FSM_Evt_Set(me_, evt)               do {me_.Status |= evt;} while(0)
#define FSM_Evt_Clr(me_, evt)               do {me_.Status &= ~evt;} while(0)

/* ********************** 任务使用示例
 * 
 *   // 事件定义
 *   #define FSM_Init_Evt    0x01     // 初始状态
 *   #define FSM_Time_Evt    0x02     // 定时任务
 *   #define FSM_IDLE_Evt    0x04     // 休眠任务
 *   #define FSM_User_Evt    0x08     // 用户任务
 *   #define FSM_All_Evt     0xFF     // 所有事件 
 * 
 *   // 任务结构体
 *   typedef struct FSMTag {
 *       fsm_sta_t  Status;       // 任务状态
 *       fsm_sta_t  Event;        // 设定事件
 *       fsm_time_t nTicks;       // 延时tick
 *       uint8_t    Run;          // 运行标志
 * 
 *       // 用户变量定义
 *   } FSM_Str;
 * 
 *   FSM_Str Flow_Control;
 * 
 *   // 应用示例
 *   fsm_sta_t System_App(void)
 *   {
 *       if (Flow_Control.Status & Sys_Init_Evt)
 *       {
 *           // 延时10 个时钟tick后运行 Sys_Time_Evt 事件
 *           FSM_Task_Start(Flow_Control, Sys_Time_Evt, 10);
 *
 *           Init_Bsp();
 *           SysTick_Start();     //启动Systick
 *           
 *           // 清除事件状态
 *           return Flow_Control.Status ^= Sys_Init_Evt;
 *       }
 * 
 *       if (Flow_Control.Status & Sys_IDLE_Evt)
 *       {
 *           Disable_Interrupt();
 *
 *           // 清除所有状态
 *           FSM_Task_Init(Flow_Control);
 *
 *           // 关闭外设 | 看门狗 | GPIO | ADC
 *           // 设置唤醒Pin
 *           // 进入休眠
 *
 *           // 按键唤醒后...
 *           // 判断唤醒条件, 是否允许唤醒
 *           if (Flow_Control.BatV_SuperLow_Sta == 0 || USB_IN_Pin)
 *           {
 *               SWDTEN = 1;  // 打开看门狗
 *
 *               FSM_Task_Start(Flow_Control, Sys_Init_Evt, 0);
 *           }
 *           else
 *           {
 *              // 条件不允许工作, 继续休眠
 *              FSM_Task_Start(Flow_Control, Sys_IDLE_Evt, 0);
 *           }
 *
 *           // 特殊情况 不清除状态
 *           return Flow_Control.Status;
 *       }
 *
 *       return 0;
 *   }
 *
 *   void main(void)
 *   {
 *       FSM_Task_Init(Flow_Control);
 *
 *       // 运行初始化任务
 *       FSM_Task_Start(Flow_Control, Sys_Init_Evt, 0);
 *       
 *       for ( ; ; )
 *       {
 *           if (Flow_Control.Run)
 *           {
 *               Flow_Control.Run = System_App();
 *           }
 *       }
 *   }
 *
 *   // 定时器中断
 *   void SysTick_ISR() interrupt 1 using 1 
 *   {
 *       FSM_Timer_Run(Flow_Control);
 *   }
 * 
 * 
 * */

#endif
